記得上課時時候提到類別與模組,他們兩個乍看之下很像,但實際上是有很大的差別,我們利用superclass來比一比,Class.superclass將會得到Module
這個結果,說明了它其實就是模組延伸出來的,簡單來說「類別」就是「模組」的後代。
> Class.superclass # => Module
> Module.superclass # => Object
除了定義的方式不同,其他差異可以先利用類別方法方法來看,得到了[]
陣列,表是其實在發法上兩者並無差異
> Class.methods - Module.methods # => [
再來我們用實體方法來看
> Class.instance_methods - Module.instance_methods
# => [:allocate, :superclass, :new]
得到了[:allocate, :superclass, :new]這幾種結果,其中allocate跟new跟產生實體有關,所以得知模組不可以做出實體物件;superclass則與繼承有關,所以模組也不能繼承任何東西。可以得知一個觀念「 類別可以繼承,但是模組不行 」。
按照龍哥所提到的例子:如果我有一個小貓類別,我希望這個小貓會飛,你會怎麼做?
小貓會飛在現實中很瘋狂啊,但程式裡就是能夠做到,列出例子來看:
module Flyable
def fly
puts "I can fly!"
end
end
class Cat
include Flyable
end
kitty = Cat.new
kitty.fly # => I can fly!
哇~在這裡貓真得會飛欸!
再來看看舉其他例子,假設小孩有位富爸爸,小孩因為include爸爸也得到了這些資產及天賦。父層模組老爸認命打拼,子層類別根本富二代能直接繼承家產家業啊!真好 (誤
module Father
def rich
puts "I am rich!"
end
def deserve
puts "I deserve it!"
end
def good
puts "I am good!"
end
def healthy
puts "I am healthy!"
end
def successful
puts "I am successful!"
end
end
class Child
include Father
end
child = Child.new
child.rich # => I am rich!
child.deserve # => I deserve it!
child.good # => I am good!
child.healthy # => I am healthy!
child.successful # => I am successful!
「我富有、我值得、我善良,健康又成功」(這段話出自我很富有
假設家庭成員多了一位新成員Baby,一樣可以include去直接得到富爸爸的所有資產及天賦喔!
class Baby
include Father
end
結論:有富爸爸可以少奮鬥30年呀~~(疑?
連結參考:
Ruby 語法放大鏡之「類別跟模組有什麼不一樣?」